#include "FLOW_core/mem.h"
#include "FLOW_ents/EntityMgr.h"
#include "FLOW_ents/namespace.h"
#include "FLOW_ents/Entity.h"

namespace ENTS
{
	//============================================================================

	CEntityMgr* CEntityMgr::sg_ents_mgr = NULL;

	//============================================================================

	CEntityMgr* CEntityMgr::GetInstance( void )
	{
		if( sg_ents_mgr == NULL )
			sg_ents_mgr = new CEntityMgr( );

		return sg_ents_mgr;
	}

	//============================================================================

	CEntityMgr::CEntityMgr( )
	{
	}

	//============================================================================

	CEntityMgr::~CEntityMgr( )
	{
		Shutdown( );
	}

	//============================================================================

	bool_t CEntityMgr::Initialize( void )
	{
		return true;
	}

	//============================================================================

	bool_t CEntityMgr::Shutdown( void )
	{
		//Free all the entities registered
		THMEnts::iterator it = m_hm_ents.begin( );
		THMEnts::iterator end = m_hm_ents.end( );

		for( ; it != end; ++it )
		{
			CEntity* p_ent = it->second;
			UnregisterEntity( p_ent );
			SAFE_DELETE( p_ent );
		}

		return true;
	}

	//============================================================================

	void CEntityMgr::Update( void )
	{
		THMEnts::iterator it = m_hm_ents.begin( );
		THMEnts::iterator end = m_hm_ents.end( );

		for( ; it != end ; ++it )
			it->second->Update( );
	}

	//============================================================================

	bool_t CEntityMgr::RegisterEntity( CEntity* ap_ent )
	{
		if( !ap_ent )
			return false;
		
		THMEnts::value_type ent( ap_ent->GetName( ).Hash( ), ap_ent );

		std::pair< THMEnts::iterator, bool_t > result = m_hm_ents.insert( ent );
		return result.second;
	}

	//============================================================================

	bool_t CEntityMgr::UnregisterEntity( CEntity* ap_ent )
	{
		if( !ap_ent )
			return true;

		THMEnts::size_type result = m_hm_ents.erase( ap_ent->GetName( ).Hash( ) );
		return result > 0;
	}

	//============================================================================

	CEntity* CEntityMgr::GetEntityByName( CStrId& ar_ent_name )
	{
		THMEnts::iterator ent = m_hm_ents.find( ar_ent_name.Hash( ) );
		return ent != m_hm_ents.end( ) ? ent->second : NULL;
	}

	//============================================================================

} // namespace ENTS